iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
自我挑戰組

全端網頁-入職三十天學習筆記系列 第 22

【全端網頁開發】Day22-JsTree-flask實做前端樹狀結構UI

  • 分享至 

  • xImage
  •  

前言

這幾天也是記錄一些針對部分功能的小專案,
這篇會是flask實做Web樹狀結構呈現
那前端要做到樹狀結構UI的其實不只一種,
像是有JsTree、FancyTree等,
那今天主要使用的是JsTree

Web樹狀結構呈現

前端呈現的內容點擊可提供下載。後端放 PDF or 圖片 or CSV

後端部分

1.新增一個scan_folder副程式
2.掃描資料夾結構根據 jsTree 規則產生資料夾結構
3.會以迴圈方式掃描資料夾,並根據資料夾或檔案給值
4.會依照不同檔名給不同的圖標

def scan_folder(path):
    data = []
    for item in os.listdir(path):
        item_path = os.path.join(path, item)
        # isdir如果是資料夾
        if os.path.isdir(item_path):
            children = scan_folder(item_path)
            node = {
                "id": item_path,
                "text": item,
                "icon": 'static/treesvg/folder-fill.svg',
                # 如果是資料夾才open,檔案則不用
                "state": {"opened": False if not children else True},
                "children": children
            }
        else:
            # 如果是文件,直接添加
            node = {
                "id": item_path,
                "text": item,
                # 依照不同檔名給不同的icon圖檔
                "icon": f'static/treesvg/filetype-{item.split(".")[-1]}.svg',
                "a_attr": {
                    "href": f"{item_path}"
                }
            }
        data.append(node)
    return data

5.form首頁路徑執行掃描副程式,並將值傳給前端

@form.route('/')
def form_page():
    # 指定要掃描的資料夾位置
    folder_path = "static/TreeFolder"
    folder_structure = json.dumps(scan_folder(folder_path), indent=4)
    return render_template('form.html',folder_structure=folder_structure)

前端部分

1.首先以CDNJS方式載入jsTree相關套件

<!-- Include required CSS and JavaScript libraries for jstree -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.12/themes/default/style.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.12/jstree.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.css">

2.將前端的值丟入js中,並確保資料準備才呼叫jsTree啟動
3.jsTree加入查詢功能、超連結 ( 下載檔案路徑 )

<div>
    <p>查詢:
        <input type="text" id="plugins4_q" value="" class="input">
    </p>
    <div id="jstree">
    </div>
    <script>
        function initializeJSTree(data) {
            $('#jstree').jstree({
                'core': {
                    'data': data,
                },
                // 展開
                'expand_all': true,
                'plugins': ['search']
            });
            var to = false;
            $('#plugins4_q').keyup(function () {
                if (to) { clearTimeout(to); }
                to = setTimeout(function () {
                    var v = $('#plugins4_q').val();
                    $('#jstree').jstree(true).search(v);
                }, 250);
            });
            $('#jstree').on('select_node.jstree', function (e, data) {
                // 獲取節點的超連結
                var link = data.node.a_attr.href;
                if (link) {
                    // 導航到超連結
                    window.location.href = link;
                }
            });
        }
        // 在確保資料已經準備好時呼叫初始化函數
        $(document).ready(function () {
            var folderStructureData = {{ folder_structure | safe
        }};
        initializeJSTree(folderStructureData);
        });
    </script>
</div>

結語

本篇主要記錄小功能的部分程式碼重點,
若有用到相同功能可以依照程式碼做參考去撰寫~


上一篇
【全端網頁開發】Day21-ETF工具Apache NiFi實做
下一篇
【全端網頁開發】Day23-Echart-flask實做資料可視化
系列文
全端網頁-入職三十天學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言